package com.example.demo.design.state_pattern.simple;

/**
 * @Author: liull
 * @Description: 环境类，包含一个对抽象状态类的引用，通过setState()可以向环境类注入不同的状态对象，再在环境类的业务方法中方调用状态对象的方法 环境类实际上是真正拥有状态的对象，我们只是将环境类中与状态有关的代码提取出来封装
 *               到专门的状态类中。在状态模式结构图中，环境类Context与抽象状态类State之间存在单向关 联关系，在Context中定义了一个State对象。在实际使用时，它们之间可能存在更为复杂的关 系，State与Context之间可能也存在依赖或者关联关系。
 *               在状态模式的使用过程中，一个对象的状态之间还可以进行相互转换，通常有两种实现状态 转换的方式： (1) 统一由环境类来负责状态之间的转换，此时，环境类还充当了状态管理器(State Manager)角
 *               色，在环境类的业务方法中通过对某些属性值的判断实现状态转换，还可以提供一个专门的 方法用于实现属性判断和状态转换，
 * @Date: Created in 19:10 2020/11/24
 * @Modified By:
 */
public class Context {

    /** 维持一个对抽象状态的引用 */
    private State state;

    /** 其它属性值，该值的变化可能会导致对象状态发生变化 */
    private int value;

    // 设置状态对象
    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        // 其他代码
        state.handle();
        // 其他代码
    }

    public void changeState() {
        // 判断属性值，根据属性值进行状态转换
        if (value == 0) {
            this.setState(new ConcreteStateA());
        } else if (value == 1) {
            this.setState(new ConcreteStateB());
        }
    }

}
